This is a source of the Windows Forms Demo application for OPC-UA that ships with QuickOPC. The application shows the most important product functions, including event-based subscriptions.
The main form:
// $Header: $ // Copyright (c) CODE Consulting and Development, s.r.o., Plzen. All rights reserved. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . using System; using System.Globalization; using System.Reflection; using System.Windows.Forms; using EasyOpcUADemo.Properties; using JetBrains.Annotations; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.Forms.Application; using OpcLabs.EasyOpc.UA.OperationModel; // ReSharper disable AssignNullToNotNullAttribute // ReSharper disable InconsistentNaming // ReSharper disable NotNullMemberIsNotInitialized // ReSharper disable PossibleNullReferenceException [assembly:CLSCompliant(true)] namespace EasyOpcUADemo { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void readButton_Click(object sender, EventArgs e) { UAAttributeData attributeData = null; Exception exception = null; try { attributeData = easyUAClient1.Read(serverUriTextBox.Text, nodeIdTextBox.Text); } catch (UAException ex) { exception = ex; } DisplayAttributeData(attributeData); DisplayException(exception); } private void DisplayAttributeData(UAAttributeData attributeData) { if (attributeData is null) { valueTextBox.Text = ""; statusTextBox.Text = ""; sourceTimestampTextBox.Text = ""; serverTimestampTextBox.Text = ""; } else { valueTextBox.Text = attributeData.DisplayValue(); statusTextBox.Text = attributeData.StatusCode.ToString(); sourceTimestampTextBox.Text = attributeData.SourceTimestamp.ToString(CultureInfo.CurrentCulture); serverTimestampTextBox.Text = attributeData.ServerTimestamp.ToString(CultureInfo.CurrentCulture); } } private void DisplayException(Exception exception) { exceptionTextBox.Text = (exception is null) ? "" : exception.GetBaseException().Message; } private bool _isSubscribed/* = false*/; private int _handle/* = 0*/; public bool IsSubscribed { get { return _isSubscribed; } set { _isSubscribed = value; subscribeMonitoredItemButton.Enabled = !_isSubscribed; changeMonitoredItemSubscriptionButton.Enabled = _isSubscribed; unsubscribeMonitoredItemButton.Enabled = _isSubscribed; } } private void subscribeButton_Click(object sender, EventArgs e) { _handle = easyUAClient1.SubscribeDataChange(serverUriTextBox.Text, nodeIdTextBox.Text, (int)samplingIntervalNumericUpDown.Value); IsSubscribed = true; } private void changeSubscriptionButton_Click(object sender, EventArgs e) { easyUAClient1.ChangeMonitoredItemSubscription(_handle, (int)samplingIntervalNumericUpDown.Value); } private void unsubscribeButton_Click(object sender, EventArgs e) { Unsubscribe(); } private void Unsubscribe() { easyUAClient1.UnsubscribeMonitoredItem(_handle); _handle = 0; IsSubscribed = false; } private void easyUAClient1_DataChangeNotification(object sender, EasyUADataChangeNotificationEventArgs e) { DisplayAttributeData((e.Exception is null) ? e.AttributeData : null); DisplayException(e.Exception); } private void aboutButton_Click(object sender, EventArgs e) { MessageBox.Show(this, Assembly.GetExecutingAssembly().FullName, Resources.MainForm_AssemblyName, MessageBoxButtons.OK, MessageBoxIcon.Information); } private void closeButton_Click(object sender, EventArgs e) { if (IsSubscribed) Unsubscribe(); Close(); } private void MainForm_Load(object sender, EventArgs e) { EasyUAFormsApplication.Instance.AddToSystemMenu(this); } private void discoverServersButton_Click(object sender, EventArgs e) { uaHostAndEndpointDialog1.EndpointDescriptor = serverUriTextBox.Text; if (uaHostAndEndpointDialog1.ShowDialog() == DialogResult.OK) serverUriTextBox.Text = uaHostAndEndpointDialog1.EndpointDescriptor.UrlString; } private void browseDataButton_Click(object sender, EventArgs e) { uaDataDialog1.EndpointDescriptor = serverUriTextBox.Text; if (uaDataDialog1.ShowDialog() == DialogResult.OK) nodeIdTextBox.Text = uaDataDialog1.NodeDescriptor.NodeId; } private void writeValueButton_Click(object sender, EventArgs e) { Exception exception = null; try { easyUAClient1.WriteValue(serverUriTextBox.Text, nodeIdTextBox.Text, valueToWriteTextBox.Text); } catch (UAException ex) { exception = ex; } DisplayException(exception); } } }
' $Header: $ ' Copyright (c) CODE Consulting and Development, s.r.o., Plzen. All rights reserved. ' ' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.Forms.Application Imports OpcLabs.EasyOpc.UA.OperationModel <Assembly: CLSCompliant(True)> Partial Public Class MainForm Inherits Form Public Sub New() InitializeComponent() End Sub ' ReSharper disable InconsistentNaming Private Sub readButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles readButton.Click ' ReSharper restore InconsistentNaming Dim attributeData As UAAttributeData = Nothing Dim exception As Exception = Nothing Try attributeData = easyUAClient1.Read(serverUriTextBox.Text, nodeIdTextBox.Text) Catch ex As UAException exception = ex End Try DisplayAttributeData(attributeData) DisplayException(exception) End Sub Private Sub DisplayAttributeData(ByVal attributeData As UAAttributeData) If attributeData Is Nothing Then valueTextBox.Text = "" statusTextBox.Text = "" sourceTimestampTextBox.Text = "" serverTimestampTextBox.Text = "" Else valueTextBox.Text = attributeData.DisplayValue() statusTextBox.Text = attributeData.StatusCode.ToString() sourceTimestampTextBox.Text = attributeData.SourceTimestamp.ToString() serverTimestampTextBox.Text = attributeData.ServerTimestamp.ToString() End If End Sub Private Sub DisplayException(ByVal exception As Exception) exceptionTextBox.Text = If(exception Is Nothing, "", exception.GetBaseException().Message) End Sub Private _isSubscribed As Boolean ' = false Private _handle As Integer ' = 0 Public Property IsSubscribed() As Boolean Get Return _isSubscribed End Get Set(ByVal value As Boolean) _isSubscribed = value subscribeMonitoredItemButton.Enabled = Not _isSubscribed changeMonitoredItemSubscriptionButton.Enabled = _isSubscribed unsubscribeMonitoredItemButton.Enabled = _isSubscribed End Set End Property ' ReSharper disable InconsistentNaming Private Sub subscribeButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles subscribeMonitoredItemButton.Click ' ReSharper restore InconsistentNaming _handle = easyUAClient1.SubscribeDataChange(serverUriTextBox.Text, nodeIdTextBox.Text, CInt(Fix(samplingIntervalNumericUpDown.Value))) IsSubscribed = True End Sub ' ReSharper disable InconsistentNaming Private Sub changeSubscriptionButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles changeMonitoredItemSubscriptionButton.Click ' ReSharper restore InconsistentNaming easyUAClient1.ChangeMonitoredItemSubscription(_handle, CInt(Fix(samplingIntervalNumericUpDown.Value))) End Sub ' ReSharper disable InconsistentNaming Private Sub unsubscribeButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles unsubscribeMonitoredItemButton.Click ' ReSharper restore InconsistentNaming Unsubscribe() End Sub Private Sub Unsubscribe() easyUAClient1.UnsubscribeMonitoredItem(_handle) _handle = 0 IsSubscribed = False End Sub ' ReSharper disable InconsistentNaming Private Sub easyUAClient1_DataChangeNotification(ByVal sender As Object, ByVal e As EasyUADataChangeNotificationEventArgs) Handles easyUAClient1.DataChangeNotification ' ReSharper restore InconsistentNaming DisplayAttributeData(If(e.Exception Is Nothing, e.AttributeData, Nothing)) DisplayException(e.Exception) End Sub ' ReSharper disable InconsistentNaming Private Sub aboutButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles aboutButton.Click ' ReSharper restore InconsistentNaming MessageBox.Show(Me, Reflection.Assembly.GetExecutingAssembly().FullName, My.Resources.MainForm_AssemblyName, MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' ReSharper disable InconsistentNaming Private Sub closeButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles closeButton.Click ' ReSharper restore InconsistentNaming If IsSubscribed Then Unsubscribe() End If Close() End Sub ' ReSharper disable InconsistentNaming Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load ' ReSharper restore InconsistentNaming EasyUAFormsApplication.Instance.AddToSystemMenu(Me) End Sub ' ReSharper disable InconsistentNaming Private Sub writeValueButton_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles writeValueButton.Click ' ReSharper restore InconsistentNaming Dim exception As Exception = Nothing Try easyUAClient1.WriteValue(serverUriTextBox.Text, nodeIdTextBox.Text, valueToWriteTextBox.Text) Catch ex As UAException exception = ex End Try DisplayException(exception) End Sub ' ReSharper disable InconsistentNaming Private Sub discoverServersButton_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles discoverServersButton.Click ' ReSharper restore InconsistentNaming uaHostAndEndpointDialog1.EndpointDescriptor = serverUriTextBox.Text If uaHostAndEndpointDialog1.ShowDialog() = DialogResult.OK Then serverUriTextBox.Text = uaHostAndEndpointDialog1.EndpointDescriptor.UrlString End If End Sub ' ReSharper disable InconsistentNaming Private Sub browseDataButton_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles browseDataButton.Click ' ReSharper restore InconsistentNaming uaDataDialog1.EndpointDescriptor = serverUriTextBox.Text If uaDataDialog1.ShowDialog() = DialogResult.OK Then nodeIdTextBox.Text = uaDataDialog1.NodeDescriptor.NodeId End If End Sub End Class
Copyright © 2004-2024 CODE Consulting and Development, s.r.o., Plzen. All rights reserved. Web page: www.opclabs.com
Send Documentation Feedback. Resources: Knowledge Base, Product Downloads. Technical support: Online Forums, FAQ.Missing some example? Ask us for it on our Online Forums! You do not have to own a commercial license in order to use Online Forums, and we reply to every post.